﻿using System;
using System.Collections.Generic;
using System.Text;
using FluorineFx;
using System.Data;
using System.Data.SqlClient;


namespace CasasJusticia.Messaging.Contexto
{
    [RemotingService("EntidadesPorCasaGeo")]
    public class EntidadesPorCasaGeo
    {
        #region Miembros de Datos

        private string _nombreVista = "CasasJusticia.dbo.View_EntidadesPorCasasGeo";

        private string _consultaDepartamento = "SELECT * FROM CasasJusticia.Casas.Departamento ORDER BY NomDepartamento";

        private string _consultaMunicipio = "SELECT * FROM CasasJusticia.Casas.Municipio WHERE IdDepartamento = '{0}' ORDER BY NomMunicipio";

        private string _consultaLocalidad = "SELECT * FROM CasasJusticia.Casas.DivisionMunicipal WHERE IdMunicipio = '{0}' ORDER BY NomDivisionMunicipal";

        private string _baseConsulta = string.Empty;

        #endregion

        #region Constructor

        public EntidadesPorCasaGeo()
        {
            this._baseConsulta = string.Concat("SELECT * FROM ", _nombreVista);
        }

        #endregion

        #region Propiedades

        ConectarBaseDatos ObjetoConexion { set; get; }

        #endregion

        #region Procedimientos y Funciones
        
        private DataTable Consultar(string sentenciaSQL)
        {
            try
            {
                this.ObtenerConexion();
                SqlCommand comando = new SqlCommand();
                comando.Connection = this.ObjetoConexion.Conexion;
                comando.CommandType = System.Data.CommandType.Text;
                comando.CommandText = sentenciaSQL;
                SqlDataReader reader = comando.ExecuteReader();
                DataTable resultado = new DataTable();
                resultado.Load(reader);
                return resultado;
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("Error al consultar: {0}", e.Message));
            }
            finally
            {
                if (ObjetoConexion != null)
                    this.ObjetoConexion.CerrarConexion();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        private void ObtenerConexion()
        {
            try
            {
                if (ObjetoConexion == null)
                    this.ObjetoConexion = new ConectarBaseDatos();

                this.ObjetoConexion.Iniciar();
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("Falló al conectar: {0}", e.Message));
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [DataTableType("CasasJusticia.Modelo.Departamento")]
        public DataTable ConsultarDepartamentos()
        {
            try
            {
                string sql = this._consultaDepartamento;
                DataTable resultado = this.Consultar(sql);
                return resultado;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [DataTableType("casasjusticia.EntidadPorCasaGeo")]
        public DataTable ConsultarEntidades()
        {
            try
            {
                string sql = string.Format("SELECT DISTINCT(IdEntidad), NomEntidad FROM {0} ORDER BY NomEntidad", this._nombreVista);
                DataTable resultado = this.Consultar(sql);
                return resultado;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idDepartamento"></param>
        /// <returns></returns>
        [DataTableType("casasjusticia.EntidadPorCasaGeo")]
        public DataTable ConsultarEntidadesDpto(string idDepartamento)
        {
            try
            {
                string sql = string.Format("SELECT DISTINCT(IdEntidad), NomEntidad FROM {0} WHERE IdDepartamento = '{1}' ORDER BY NomEntidad", this._nombreVista, idDepartamento);
                DataTable resultado = this.Consultar(sql);
                return resultado;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idDepartamento"></param>
        /// <param name="idMunicipio"></param>
        /// <returns></returns>
        [DataTableType("casasjusticia.EntidadPorCasaGeo")]
        public DataTable ConsultarEntidadesMpio(string idMunicipio)
        {
            try
            {
                string sql = string.Format("SELECT DISTINCT(IdEntidad), NomEntidad FROM {0} WHERE IdMunicipio = '{1}' ORDER BY NomEntidad", this._nombreVista, idMunicipio);
                DataTable resultado = this.Consultar(sql);
                return resultado;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idDepartamento"></param>
        /// <param name="idMunicipio"></param>
        /// <param name="idLocalidad"></param>
        /// <returns></returns>
        [DataTableType("casasjusticia.EntidadPorCasaGeo")]
        public DataTable ConsultarEntidadesLocalidad(string idMunicipio, string idLocalidad)
        {
            try
            {
                string sql = string.Format("SELECT DISTINCT(IdEntidad), NomEntidad FROM {0} WHERE IdMunicipio = '{1}' AND IdDivisionMunicipal = {2} ORDER BY NomEntidad", this._nombreVista, idMunicipio, idLocalidad);
                DataTable resultado = this.Consultar(sql);
                return resultado;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idDepartamento"></param>
        /// <returns></returns>
        [DataTableType("CasasJusticia.Modelo.DivisionMunicipal")]
        public DataTable ConsultarLocalidadesPorMunicipio(string idMunicipio)
        {
            try
            {
                string sql = string.Format(this._consultaLocalidad, idMunicipio);
                DataTable resultado = this.Consultar(sql);
                return resultado;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idDepartamento"></param>
        /// <returns></returns>
        [DataTableType("CasasJusticia.Modelo.Municipio")]
        public DataTable ConsultarMunicipiosPorDpto(string idDepartamento)
        {
            try
            {
                string sql = string.Format(this._consultaMunicipio, idDepartamento);
                DataTable resultado = this.Consultar(sql);
                return resultado;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [DataTableType("casasjusticia.EntidadPorCasaGeo")]
        public DataTable ConsultarTodo()
        {
            try
            {
                string sql = this._baseConsulta;
                DataTable resultado = this.Consultar(sql);
                return resultado;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }           
        }

        #endregion
    }
}
